import { ElLoading } from "element-plus";

// 默认设置
const defaultOptions = {
  //锁定屏幕滚动
  lock: true,
  text: "正在加载...",
  background: "rgba(0, 0, 0, 0.1)",
};

/**
 *导出加载组件模块使用
 * @param {请求函数} fn
 * @param {加载组件配置参数} options
 * @returns
 */
export const loadModule = (fn, options = {}) => {
  let loading;
  let _options;

  //   打开加载组件
  const showLoading = (options) => {
    loading = ElLoading.service(options);
  };

  // 关闭加载组件
  const closeLoading = () => {
    if (loading) {
      loading.close();
    }
  };

  // 浅拷贝options,如果没有传入options即{}就使用默认，否则使用传入值
  if (Object.keys(options).length === 0) {
    _options = Object.assign(defaultOptions, options);
  } else {
    _options = options;
  }

  const newFn = (...args) => {
    try {
      // 打开加载模块
      showLoading(_options);
      // 执行函数获取返回值
      const result = fn(...args);
      const isPromise = result instanceof Promise;
      // 同步请求
      if (!isPromise) {
        closeLoading();
        return result;
      }
      // 异步请求处理，成功关闭加载返回响应值
      return result
        .then((res) => {
          closeLoading();
          return res;
        })
        .catch((err) => {
          closeLoading();
          throw err;
        });
    } catch (error) {
      closeLoading();
      throw error;
    }
  };
  return newFn;
};
